//
// Created by Administrator on 2021/1/11.
//

#include "JavaCallHelp.h"

JavaCallHelp::JavaCallHelp(JavaVM *vm, JNIEnv *_env, jobject thiz) {
    javaVM =vm;
    env=_env;//env环境变量是和当前线程绑定的,如果java层的线程的env环境和C中线程不一致,那么就需要拿到C层线程的env环境,再去进行操作
    //将此引用设置为全局引用
    thiz=env->NewGlobalRef(thiz);
    //通过java提供的jniEnv环境通过反射获取类的字节码
    jclass  jclass =env->GetObjectClass(thiz);
    jmid_error = env->GetMethodID(jclass, "onError", "(I)V");
    jmid_prepare = env->GetMethodID(jclass, "onPrepare", "()V");
    jmid_progress = env->GetMethodID(jclass, "onProgress", "(I)V");
}

JavaCallHelp::~JavaCallHelper() {
    env->DeleteGlobalRef(jobj);
    jobj = NULL;
}

void JavaCallHelp::onError(int code, int thread) {
    //如果当前是子线程,但是env在初始化的时候是主线程传入的,是主线程的环境
    if (thread == THREAD_CHILD) {
        JNIEnv *jniEnv;
        //所以需要拿到当前线程的env环境,再去调用方法
        if (javaVM->AttachCurrentThread(&jniEnv, 0) != JNI_OK) {
            return;
        }
        //此处是在子线程中调用,那么java层也是子线程中调用
        jniEnv->CallVoidMethod(jobj, jmid_error, code);
        //此处记得释放
        javaVM->DetachCurrentThread();
    } else {
        env->CallVoidMethod(jobj, jmid_error, code);
    }
}

void JavaCallHelp::onParpare(int thread) {
    //如果当前是子线程,但是env在初始化的时候是主线程传入的,是主线程的环境
    if (thread == THREAD_CHILD) {
        JNIEnv *jniEnv;
        //所以需要拿到当前线程的env环境,再去调用方法
        if (javaVM->AttachCurrentThread(&jniEnv, 0) != JNI_OK) {
            return;
        }
        //此处是在子线程中调用,那么java层也是子线程中调用
        jniEnv->CallVoidMethod(jobj, jmid_prepare);
        //此处记得释放
        javaVM->DetachCurrentThread();
    } else {
        env->CallVoidMethod(jobj, jmid_prepare);
    }
}

void JavaCallHelp::onProgress(int progress, int thread) {
    //如果当前是子线程,但是env在初始化的时候是主线程传入的,是主线程的环境
    if (thread == THREAD_CHILD) {
        //所以需要拿到当前线程的env环境,再去调用方法
        JNIEnv *jniEnv;
        if (javaVM->AttachCurrentThread(&jniEnv, 0) != JNI_OK) {
            return;
        }
        //此处是在子线程中调用,那么java层也是子线程中调用
        jniEnv->CallVoidMethod(jobj, jmid_progress, progress);
        //此处记得释放
        javaVM->DetachCurrentThread();
    } else {
        env->CallVoidMethod(jobj, jmid_progress, progress);
    }
}